package com.hpin.fansea.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.text.format.DateUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.WindowManager;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 常用工具类
 *
 * @author Aaron
 */
public class CommonUtils {

    /**
     * MD5加密
     *
     * @param bytes 字节数组
     * @return 加密后的值
     */
    public static String toMd5(byte[] bytes) {
        try {
            MessageDigest algorithm = MessageDigest.getInstance("MD5");
            algorithm.reset();
            algorithm.update(bytes);
            return toHexString(algorithm.digest(), "");
        } catch (NoSuchAlgorithmException e) {
            Log.v("util", "toMd5():" + e);
            throw new RuntimeException(e);
        }
    }

    private static String toHexString(byte[] bytes, String separator) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xFF & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex).append(separator);
        }
        return hexString.toString();
    }

    /**
     * 网络是否可用
     *
     * @param context
     * @return
     */
    public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager mgr = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] info = mgr.getAllNetworkInfo();
        if (info != null) {
            for (int i = 0; i < info.length; i++) {
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 电话号码验证
     *
     * @param str
     * @return 验证通过返回true
     */
    public static boolean isPhone(String str) {

        try {
            Pattern p = null;
            Matcher m = null;
            boolean b = false;
            p = Pattern.compile("^[0-9]{7,8}$|^1[3,4,5,7,8][0-9]{9}$"); // 验证手机号
            // 和座机号
            m = p.matcher(str);
            b = m.matches();
            return b;
        } catch (Exception e) {

            return false;
        }


    }

    /**
     * 获取当前时间
     *
     * @param context
     * @return
     */
    public static String getCurrentTime(Context context) {
        // 刷新时间
        String time = DateUtils.formatDateTime(context,
                System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME
                        | DateUtils.FORMAT_SHOW_DATE
                        | DateUtils.FORMAT_ABBREV_ALL);
        return time;

    }


    /**
     * 描述：获取表示当前日期时间的字符串.
     *
     * @param format 格式化字符串，如："yyyy-MM-dd HH:mm:ss"
     * @return String String类型的当前日期时间
     */
    public static String getCurrentDate(String format) {
        String curDateTime = null;
        try {
            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
            Calendar c = new GregorianCalendar();
            curDateTime = mSimpleDateFormat.format(c.getTime());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return curDateTime;

    }

    /**
     * 是否为空
     *
     * @param str
     * @return true为空 false 不为空
     */
    public static boolean isNull(String str) {

        if (str == null)
            return true;

        if ("".equals(str))
            return true;

        if ("null".equals(str))
            return true;

        return false;
    }

    /**
     * 判断 字符串是否可以转为整形
     *
     * @param str
     * @return true 为 可以  false 为不可以
     */
    public static boolean isStr2Num(String str) {

        try {

            Integer.parseInt(str);

            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 获得屏幕的尺寸
     *
     * @param ctx 上下文对象
     * @return 屏幕宽高的 数组  0位宽  1为高
     */
    public static int[] getScreenSize(Context ctx) {

        DisplayMetrics metric = new DisplayMetrics();
        WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
        wm.getDefaultDisplay().getMetrics(metric);
        int width = metric.widthPixels;     // 屏幕宽度（像素）
        int height = metric.heightPixels;   // 屏幕高度（像素）
//        float density = metric.density;      // 屏幕密度（0.75 / 1.0 / 1.5）
//        int densityDpi = metric.densityDpi;  // 屏幕密度DPI（120 / 160 / 240）

        int[] sizes = {width, height};

        return sizes;
    }

    /**
     * 获得图片的字节
     *
     * @param image
     * @return
     */
    public static byte[] compressByte(Bitmap image) {
        byte[] bytes = null;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos); // 质量压缩100% 未压缩
        bytes = baos.toByteArray();
        try {
            baos.close();
        } catch (IOException e) {
            Log.v("图片压缩", e.getMessage());
        }
        return bytes;
    }

    /**
     * 根据图片本地地址获得bitmap
     *
     * @param picturePath 图片的本地地址
     * @return
     */
    public static Bitmap getBitmapFromPath(String picturePath) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        // options 设为true时，构造出的bitmap没有图片，只有一些长宽等配置信息，但比较快，设为false时，才有图片
        options.inJustDecodeBounds = true;
        Bitmap b = BitmapFactory.decodeFile(picturePath, options);
        int scale = (int) (options.outWidth / (float) 300);
        if (scale <= 0)
            scale = 1;
        options.inSampleSize = scale;
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(picturePath, options);
    }
    /**
     * 保留0位精度
     *
     * @param param
     * @return
     */
    public static double float0(Double param) {
        double f = param;
        BigDecimal b = new BigDecimal(f);
        double f1 = b.setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();
        return f1;
    }

    /**
     * 保留两位精度
     *
     * @param param
     * @return
     */
    public static double float2(Double param) {
        double f = param;
        BigDecimal b = new BigDecimal(f);
        double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        return f1;
    }

}
